package com.ruoyi.common.core.web.domain;

import com.ruoyi.common.core.constant.HttpStatus;
import java.io.Serializable;
import java.util.Optional;
import lombok.Getter;
import lombok.Setter;

/**
 * 操作消息提醒
 *
 * @author ruoyi
 */
@Setter
@Getter
public class APIResult<T> implements Serializable {

  private static final long serialVersionUID = 1L;

  /**
   * 状态码
   */
  private int code;

  /**
   * 返回内容
   */
  private String msg;

  /**
   * 数据对象
   */
  private T data;

  /**
   * 初始化一个新创建的 AjaxResult 对象，使其表示一个空消息。
   */
  private APIResult() {
  }

//  /**
//   * 初始化一个新创建的 AjaxResult 对象
//   *
//   * @param code 状态码
//   * @param msg  返回内容
//   */
//  private APIResult(int code, String msg) {
//    this.code = code;
//    this.msg = msg;
//  }

  /**
   * 初始化一个新创建的 AjaxResult 对象
   *
   * @param code 状态码
   * @param msg  返回内容
   * @param data 数据对象
   */
  public APIResult(int code, String msg, T data) {
    this.code = code;
    this.msg = msg;
    this.data = data;
  }

  /**
   * 返回成功消息
   *
   * @return 成功消息
   */
  public static <T> APIResult<T> success() {
    return success(null, null);
  }

  /**
   * 返回成功数据
   *
   * @return 成功消息
   */
  public static <T> APIResult<T> success(T data) {
    return success(null, data);
  }

  /**
   * 返回成功消息
   *
   * @param msg 返回内容
   * @return 成功消息
   */
  public static <T> APIResult<T> success(String msg) {
    return success(msg, null);
  }

  /**
   * 返回成功消息
   *
   * @param msg  返回内容
   * @param data 数据对象
   * @return 成功消息
   */
  public static <T> APIResult<T> success(String msg, T data) {
    return new APIResult<T>(HttpStatus.SUCCESS, Optional.ofNullable(msg).orElse("操作成功"), data);
  }

  /**
   * 返回警告消息
   *
   * @param msg 返回内容
   * @return 警告消息
   */
  public static <T> APIResult<T> warn(String msg) {
    return warn(msg, null);
  }

  /**
   * 返回警告消息
   *
   * @param msg  返回内容
   * @param data 数据对象
   * @return 警告消息
   */
  public static <T> APIResult<T> warn(String msg, T data) {
    return new APIResult<T>(HttpStatus.WARN, Optional.ofNullable(msg).orElse("警告信息"), data);
  }

  /**
   * 返回错误消息
   *
   * @return 错误消息
   */
  public static <T> APIResult<T> error() {
    return APIResult.error("操作失败");
  }

  /**
   * 返回错误消息
   *
   * @param msg 返回内容
   * @return 错误消息
   */
  public static <T> APIResult<T> error(String msg) {
    return error(msg, null);
  }

  /**
   * 返回错误消息
   *
   * @param msg  返回内容
   * @param data 数据对象
   * @return 错误消息
   */
  public static <T> APIResult<T> error(String msg, T data) {
    return error(HttpStatus.ERROR, msg, data);
  }

  /**
   * 返回错误消息
   *
   * @param code 状态码
   * @param msg  返回内容
   * @return 错误消息
   */
  public static <T> APIResult<T> error(int code, String msg) {
    return error(code, msg, null);
  }

  /**
   * 返回错误消息
   *
   * @param code 状态码
   * @param msg  返回内容
   * @return 错误消息
   */
  public static <T> APIResult<T> error(int code, String msg, T data) {
    return new APIResult<T>(code, msg, data);
  }

  /**
   * 是否为成功消息
   *
   * @return 结果
   */
  public boolean isSuccess() {
    return HttpStatus.SUCCESS == this.code;
  }

  /**
   * 是否为警告消息
   *
   * @return 结果
   */
  public boolean isWarn() {
    return HttpStatus.WARN == this.code;
  }

  /**
   * 是否为错误消息
   *
   * @return 结果
   */
  public boolean isError() {
    return HttpStatus.ERROR == this.code;
  }

}
